package com.hliushi.spark.exmaple

import org.apache.spark.{SparkConf, SparkContext}

/**
 * descriptions:
 *
 * author: Hliushi
 * date: 2021/5/13 15:04
 */
object SparkReduceByKey {

  //val conf: SparkConf = new SparkConf().setMaster("local").setAppName("SparkReduceByKey")

  //val sc = new SparkContext(conf)

  /**
   * reduceByKey和reduce的区别在哪呢?
   * 在单词统计中, 我们采用的是reduceByKey, 对于每一个单词我们设置成一个键值对(key, value)
   * 我们把单词作为key, key = word, 而value = 1, 因为遍历过程中, 每个单词的出现一次, 就标注为1
   * 那么reduceByKey则会把key相同的进行归并, 然后根据我们定义的归并方法即对value进行累加处理,
   * 最后得到每个单词出现的次数, 而reduce则没有相同key归并的操作, 而是将所有制统一归并, 一并处理
   *
   * ##
   * Spark的reduceByKey对要处理的值进行了差别对待, 只有key相同的才能进行reduceByKey
   * 则也就要求了进行reduceByKey时, 输入的数据必须满足有键有值[key-value对]
   * ##
   * 本案例中使用reduceByKey完成统计随机数末尾是0-9个数值出现的个数
   *
   * @param args
   */
  def main(args: Array[String]): Unit = {
    val conf = new SparkConf().setMaster("local").setAppName("SparkReduceByKey")

    val sc = new SparkContext(conf)

    // 将String转成Long类型
    /**
     * 小知识点: 261487 / 1 % 10 = 7
     * .        261487 / 1 % 100 = 77
     * .        261487 / 10 % 10 = 8
     * .        261487 / 100 % 10 = 4
     */
    val numData = sc.textFile("./dataset/avg").map(numStr => numStr.toLong % 10 -> 1)

    val result = numData.reduceByKey((x, y) => {
      println(s"x = ${x} - y = ${y}")
      x + y
    })

    // 使用sortByKey根据key排序后输出 [默认升序]
    val resultSort = result.sortByKey()
    resultSort.foreach(println(_))
  }


}